home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -in_the_mag- / emulation / amiga / uae-0.7.0b2 / src / md-i386-watcom / m68k.h next >
C/C++ Source or Header  |  1998-01-20  |  5KB  |  181 lines

  1.  /* 
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   * MC68000 emulation - machine dependent bits
  5.   *
  6.   * Copyright 1997 Bernd Schmidt
  7.   */
  8.  
  9. struct flag_struct {
  10.     unsigned int c:1; /* first byte */
  11.     int :5;
  12.     unsigned int z:1;
  13.     unsigned int n:1;
  14.     int :3;           /* second, third & fourth byte */
  15.     unsigned int v:1; 
  16.     int :20;
  17.     unsigned int x:1; /* fifth */
  18.     int :31;
  19. };
  20.  
  21. extern struct flag_struct regflags;
  22.  
  23. #define ZFLG (regflags.z)
  24. #define NFLG (regflags.n)
  25. #define CFLG (regflags.c)
  26. #define VFLG (regflags.v)
  27. #define XFLG (regflags.x)
  28.  
  29. static __inline__ int cctrue(const int cc)
  30. {
  31.     switch(cc){
  32.      case 0: return 1;                       /* T */
  33.      case 1: return 0;                       /* F */
  34.      case 2: return !CFLG && !ZFLG;          /* HI */
  35.      case 3: return CFLG || ZFLG;            /* LS */
  36.      case 4: return !CFLG;                   /* CC */
  37.      case 5: return CFLG;                    /* CS */
  38.      case 6: return !ZFLG;                   /* NE */
  39.      case 7: return ZFLG;                    /* EQ */
  40.      case 8: return !VFLG;                   /* VC */
  41.      case 9: return VFLG;                    /* VS */
  42.      case 10:return !NFLG;                   /* PL */
  43.      case 11:return NFLG;                    /* MI */
  44.      case 12:return NFLG == VFLG;            /* GE */
  45.      case 13:return NFLG != VFLG;            /* LT */
  46.      case 14:return !ZFLG && (NFLG == VFLG); /* GT */
  47.      case 15:return ZFLG || (NFLG != VFLG);  /* LE */
  48.     }
  49.     abort();
  50.     return 0;
  51. }
  52.  
  53. void x86_flag_testl (uae_u32 v);
  54. void x86_flag_testw (uae_s16 v);
  55. void x86_flag_testb (uae_s8 v);
  56. void x86_flag_cmpl (uae_u32 s, uae_s32 d);
  57. void x86_flag_cmpw (uae_s16 s, uae_s16 d);
  58. void x86_flag_cmpb (uae_s8 s, uae_s8 d);
  59. uae_u32 x86_flag_doaddl (uae_u32 s, uae_s32 d);
  60. uae_u32 x86_flag_doaddw (uae_s16 s, uae_s16 d);
  61. uae_u32 x86_flag_doaddb (uae_s8 s, uae_s8 d);
  62. uae_u32 x86_flag_dosubl (uae_u32 s, uae_s32 d);
  63. uae_u32 x86_flag_dosubw (uae_s16 s, uae_s16 d);
  64. uae_u32 x86_flag_dosubb (uae_s8 s, uae_s8 d);
  65.  
  66. #define x86_flag_addl(v,s,d) do { v = x86_flag_doaddl(s,d); } while (0)
  67. #define x86_flag_addw(v,s,d) do { v = x86_flag_doaddw(s,d); } while (0)
  68. #define x86_flag_addb(v,s,d) do { v = x86_flag_doaddb(s,d); } while (0)
  69. #define x86_flag_subl(v,s,d) do { v = x86_flag_dosubl(s,d); } while (0)
  70. #define x86_flag_subw(v,s,d) do { v = x86_flag_dosubw(s,d); } while (0)
  71. #define x86_flag_subb(v,s,d) do { v = x86_flag_dosubb(s,d); } while (0)
  72.  
  73. #pragma aux x86_flag_testl = \
  74.  "test edx,edx" \
  75.  "pushfd" \
  76.  "pop ecx" \
  77.  "mov DWORD [regflags],ecx" \
  78.  parm [edx] \
  79.  modify [ecx]
  80.  
  81. #pragma aux x86_flag_testw = \
  82.  "test dx,dx" \
  83.  "pushfd" \
  84.  "pop ecx" \
  85.  "mov DWORD [ regflags],ecx" \
  86.  parm [dx] \
  87.  modify [ecx]
  88.  
  89. #pragma aux x86_flag_testb = \
  90.  "test dl,dl" \
  91.  "pushfd" \
  92.  "pop ecx" \
  93.  "mov DWORD [ regflags],ecx" \
  94.  parm [dl] \
  95.  modify [ecx]
  96.  
  97. #pragma aux x86_flag_doaddl = \
  98.  "add edx,ecx" \
  99.  "pushfd" \
  100.  "pop ecx" \
  101.  "mov DWORD [ regflags],ecx" \
  102.  "mov DWORD [ regflags + 4],ecx" \
  103.  parm [ecx] [edx] \
  104.  value [edx] \
  105.  modify [ecx]
  106.  
  107. #pragma aux x86_flag_doaddw = \
  108.  "add dx,cx" \
  109.  "pushfd" \
  110.  "pop ecx" \
  111.  "mov DWORD [ regflags],ecx" \
  112.  "mov DWORD [ regflags + 4],ecx" \
  113.  parm [cx] [dx] \
  114.  value [edx] \
  115.  modify [ecx]
  116.  
  117. #pragma aux x86_flag_doaddb = \
  118.  "add dl,cl" \
  119.  "pushfd" \
  120.  "pop ecx" \
  121.  "mov DWORD [ regflags],ecx" \
  122.  "mov DWORD [ regflags + 4],ecx" \
  123.  parm [cl] [dl] \
  124.  value [edx] \
  125.  modify [ecx]
  126.  
  127. #pragma aux x86_flag_dosubl = \
  128.  "sub edx,ecx" \
  129.  "pushfd" \
  130.  "pop ecx" \
  131.  "mov DWORD [ regflags],ecx" \
  132.  "mov DWORD [ regflags + 4],ecx" \
  133.  parm [ecx] [edx] \
  134.  value [edx] \
  135.  modify [ecx]
  136.  
  137. #pragma aux x86_flag_dosubw = \
  138.  "sub dx,cx" \
  139.  "pushfd" \
  140.  "pop ecx" \
  141.  "mov DWORD [ regflags],ecx" \
  142.  "mov DWORD [ regflags + 4],ecx" \
  143.  parm [cx] [dx] \
  144.  value [edx] \
  145.  modify [ecx]
  146.  
  147. #pragma aux x86_flag_dosubb = \
  148.  "sub dl,cl" \
  149.  "pushfd" \
  150.  "pop ecx" \
  151.  "mov DWORD [ regflags],ecx" \
  152.  "mov DWORD [ regflags + 4],ecx" \
  153.  parm [cl] [dl] \
  154.  value [edx] \
  155.  modify [ecx]
  156.  
  157. #pragma aux x86_flag_cmpl = \
  158.  "cmp edx,ecx" \
  159.  "pushfd" \
  160.  "pop ecx" \
  161.  "mov DWORD [ regflags],ecx" \
  162.  parm [ecx] [edx] \
  163.  modify [ecx]
  164.  
  165. #pragma aux x86_flag_cmpw = \
  166.  "cmp dx,cx" \
  167.  "pushfd" \
  168.  "pop ecx" \
  169.  "mov DWORD [ regflags],ecx" \
  170.  parm [cx] [dx] \
  171.  modify [ecx]
  172.  
  173. #pragma aux x86_flag_cmpb = \
  174.  "cmp dl,cl" \
  175.  "pushfd" \
  176.  "pop ecx" \
  177.  "mov DWORD [ regflags],ecx" \
  178.  parm [cl] [dl] \
  179.  modify [ecx]
  180.  
  181.